{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 调参第2.2步：微调树参数：max_depth & min_child_weight"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import xgboost as xgb\n",
    "from xgboost import XGBClassifier\n",
    "\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "dpath = './data/'\n",
    "train = pd.read_csv(dpath + \"RentListingInquries_FE_train.csv\")\n",
    "test = pd.read_csv(dpath + \"RentListingInquries_FE_test.csv\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "数据探索在第一步做过，因此略过，将训练数据集和类别标签进行分割"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train = train['interest_level']\n",
    "X_train = train.drop(['interest_level'], axis =1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "根据上一步max_depth & min_child_weight的最佳结果，缩小参数寻找范围"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'max_depth': [4, 5, 6], 'min_child_weight': [4, 5, 6]}"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 上一步得到结果为5，5这次将搜索范围围绕5，5步长为1展开\n",
    "max_depth = [4,5,6]\n",
    "min_child_weight = [4,5,6]\n",
    "param_test2_2 = dict(max_depth=max_depth, min_child_weight=min_child_weight)\n",
    "param_test2_2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "利用gridsearch cv寻参"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义xgboost参数并生成模型，保留第一步设置的最优n_estimators\n",
    "xgb2_2 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=248,  #第一轮参数调整得到的n_estimators最优值\n",
    "        max_depth=5,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.3,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/cuiyue/anaconda2/lib/python2.7/site-packages/sklearn/model_selection/_search.py:761: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "([mean: -0.59193, std: 0.00352, params: {'max_depth': 4, 'min_child_weight': 4},\n",
       "  mean: -0.59243, std: 0.00365, params: {'max_depth': 4, 'min_child_weight': 5},\n",
       "  mean: -0.59262, std: 0.00327, params: {'max_depth': 4, 'min_child_weight': 6},\n",
       "  mean: -0.58952, std: 0.00289, params: {'max_depth': 5, 'min_child_weight': 4},\n",
       "  mean: -0.58898, std: 0.00331, params: {'max_depth': 5, 'min_child_weight': 5},\n",
       "  mean: -0.58949, std: 0.00336, params: {'max_depth': 5, 'min_child_weight': 6},\n",
       "  mean: -0.58825, std: 0.00439, params: {'max_depth': 6, 'min_child_weight': 4},\n",
       "  mean: -0.58837, std: 0.00508, params: {'max_depth': 6, 'min_child_weight': 5},\n",
       "  mean: -0.58743, std: 0.00341, params: {'max_depth': 6, 'min_child_weight': 6}],\n",
       " {'max_depth': 6, 'min_child_weight': 6},\n",
       " -0.587428646464157)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 调用CV并输出参数在不同参数的分数的均值、方差以及最优参数和分数\n",
    "kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=3)\n",
    "gsearch2_2 = GridSearchCV(xgb2_2, param_grid = param_test2_2, scoring='neg_log_loss',n_jobs=-1, cv=kfold)\n",
    "gsearch2_2.fit(X_train , y_train)\n",
    "\n",
    "gsearch2_2.grid_scores_, gsearch2_2.best_params_, gsearch2_2.best_score_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/cuiyue/anaconda2/lib/python2.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/cuiyue/anaconda2/lib/python2.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/cuiyue/anaconda2/lib/python2.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/cuiyue/anaconda2/lib/python2.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/cuiyue/anaconda2/lib/python2.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/cuiyue/anaconda2/lib/python2.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/cuiyue/anaconda2/lib/python2.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'mean_fit_time': array([212.76915183, 208.53900561, 207.02517762, 247.13514442,\n",
       "        245.36627097, 245.78376021, 287.04271822, 285.32496967,\n",
       "        264.06533885]),\n",
       " 'mean_score_time': array([0.78683357, 0.743606  , 0.6396244 , 0.80963159, 0.83482943,\n",
       "        0.8504086 , 1.01931057, 1.00874395, 0.83724656]),\n",
       " 'mean_test_score': array([-0.5919254 , -0.59242646, -0.59261526, -0.58952208, -0.58898155,\n",
       "        -0.58948834, -0.58824714, -0.58836612, -0.58742865]),\n",
       " 'mean_train_score': array([-0.5470821 , -0.54780383, -0.54867754, -0.51231185, -0.51419885,\n",
       "        -0.515616  , -0.47202817, -0.47514876, -0.47852744]),\n",
       " 'param_max_depth': masked_array(data=[4, 4, 4, 5, 5, 5, 6, 6, 6],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'param_min_child_weight': masked_array(data=[4, 5, 6, 4, 5, 6, 4, 5, 6],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'params': [{'max_depth': 4, 'min_child_weight': 4},\n",
       "  {'max_depth': 4, 'min_child_weight': 5},\n",
       "  {'max_depth': 4, 'min_child_weight': 6},\n",
       "  {'max_depth': 5, 'min_child_weight': 4},\n",
       "  {'max_depth': 5, 'min_child_weight': 5},\n",
       "  {'max_depth': 5, 'min_child_weight': 6},\n",
       "  {'max_depth': 6, 'min_child_weight': 4},\n",
       "  {'max_depth': 6, 'min_child_weight': 5},\n",
       "  {'max_depth': 6, 'min_child_weight': 6}],\n",
       " 'rank_test_score': array([7, 8, 9, 6, 4, 5, 2, 3, 1], dtype=int32),\n",
       " 'split0_test_score': array([-0.58592865, -0.58634517, -0.5875715 , -0.58447101, -0.58309847,\n",
       "        -0.58403601, -0.58179576, -0.58102972, -0.58198253]),\n",
       " 'split0_train_score': array([-0.54911512, -0.54972514, -0.55075278, -0.51332008, -0.51459404,\n",
       "        -0.51583925, -0.4746011 , -0.47655712, -0.48092631]),\n",
       " 'split1_test_score': array([-0.59129339, -0.5912743 , -0.59068657, -0.58889697, -0.5882385 ,\n",
       "        -0.58802249, -0.58709731, -0.58513397, -0.58634641]),\n",
       " 'split1_train_score': array([-0.54752435, -0.5483014 , -0.54914112, -0.51299926, -0.51466603,\n",
       "        -0.5157825 , -0.47302892, -0.4760851 , -0.47841844]),\n",
       " 'split2_test_score': array([-0.59154225, -0.59215481, -0.59262151, -0.58959496, -0.5897261 ,\n",
       "        -0.58963569, -0.58606635, -0.58763791, -0.58723963]),\n",
       " 'split2_train_score': array([-0.54715374, -0.5482763 , -0.54858932, -0.51255631, -0.5147493 ,\n",
       "        -0.51603189, -0.47024865, -0.47478976, -0.47793432]),\n",
       " 'split3_test_score': array([-0.59602804, -0.59632566, -0.59603223, -0.59227154, -0.59099069,\n",
       "        -0.59194045, -0.59244192, -0.59354764, -0.58926078]),\n",
       " 'split3_train_score': array([-0.54575629, -0.54636531, -0.54724976, -0.51203766, -0.51324275,\n",
       "        -0.51529307, -0.47035027, -0.47369785, -0.47746333]),\n",
       " 'split4_test_score': array([-0.59483554, -0.59603346, -0.59616558, -0.59237679, -0.59285515,\n",
       "        -0.59380838, -0.59383604, -0.59448324, -0.59231536]),\n",
       " 'split4_train_score': array([-0.54586099, -0.54635099, -0.54765473, -0.51064596, -0.51374214,\n",
       "        -0.51513328, -0.4719119 , -0.47461395, -0.47789481]),\n",
       " 'std_fit_time': array([ 1.92501063,  0.15463097,  0.6484973 ,  0.76284712,  0.23774594,\n",
       "         0.51553114,  1.36824194,  1.46473723, 34.20795423]),\n",
       " 'std_score_time': array([0.11960508, 0.06204527, 0.01526815, 0.06285137, 0.05876602,\n",
       "        0.10593799, 0.10029072, 0.12168298, 0.1823473 ]),\n",
       " 'std_test_score': array([0.00351594, 0.00364959, 0.00326923, 0.00288508, 0.0033093 ,\n",
       "        0.00336368, 0.00439378, 0.00508062, 0.00340881]),\n",
       " 'std_train_score': array([0.00123148, 0.00129169, 0.00123402, 0.000938  , 0.00060002,\n",
       "        0.00034288, 0.00165028, 0.00103733, 0.001237  ])}"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gsearch2_2.cv_results_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best: -0.587429 using {'max_depth': 6, 'min_child_weight': 6}\n"
     ]
    },
    {
     "data": {
      "image/png": "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fEqXq/rq9t+/xMaKwf0DMXvKGG795+5/eZYtW8bWrVtZsGAB559/PoWFhTz44IM0NDSwePFibr/9dmpqarjiiisoLy+npaWF//qv/2Lnzp1UVFRwzjnnUFBQwJNPPpnw+Lm5uXziE5/g8ccfJy8vj//+7//mP/7jP9i+fTt33XUXl112WdzZxW233cb27dt57bXX2L59O5/61Ke4/vrru6z/j370I+68807MjHnz5vHjH/8YgKeeeoqvfvWrvP3229xxxx0sWbKEbdu2cemll/Liiy/GHWPPnj1ceeWV7Nq1i4ULF9LdxId33HEHWVlZXH/99dxwww2sX7+elStX8sQTT3DvvffywAMPsGLFCm699VYaGho45phjuPfee8nNzeXss8/mzjvvpLS0lB/84Ad85StfYcqUKRx33HFkZmbyzW9+s8u6L1u2jJdffpkFCxZw9dVXc8MNN8TVq7y8nD/84Q/ccsstfPWrX+32Zy7DQ2/abi5w9/3ApUA5cDxwU6S1EonA8uXLOeaYY1i3bh3nn38+r776Ks8//zzr1q1j9erVPPXUU/zpT39iypQprF+/nhdffJELL7yQ66+/nilTpvDkk092GTIANTU1nH322axevZrRo0fz2c9+lscee4zf/OY3fO5zn0u4z6ZNm/jzn//M888/z+23305TU1PCci+99BJf+tKXWLlyJevXr+frX/96+7YdO3bw9NNP88gjj7Bs2bJu34Pbb7+dM844g7Vr13LZZZexffv2LsueeeaZ/PWvfwWCJr+DBw/S1NTE008/zaJFi9i9ezdf/OIXefzxx1mzZg2lpaWd/vBXVFTwhS98gWeffZbHHnuMTZs2xW1PVPfly5ezaNEi1q1bxw033EBFRQUXX3xx+z6f+tSnuOOOO0hR0/OI0ZtrNG3fFroY+Jm77x2xPTpkWOjpzGMorFixghUrVlBcHMwgefDgQV599VUWLVrEjTfeyGc+8xkuvfRSFi1a1OtjZmRkcOGFFwIwd+5cMjMzSU9PZ+7cuWzbti3hPpdccgmZmZlkZmZSWFjIzp07mTZtWqdyK1euZMmSJe3XUvLz89u3vfvd7yYlJYXZs2ezc+fObuv41FNP8etf/7r9ufPyuh466OSTT2b16tUcOHCAzMxMSkpKKCsr469//St33303zz77LBs3buT004Nuuo2NjZx22mlxx3j++ec566yz2uv73ve+l1deeaVPdZ8yZQqPPvooAI888giFhYWcfPLJrFq1qtvXKsNHb4Lm92a2iaDp7ONmNgHQ17tlRHN3br75Zj7ykY902rZ69WoeffRRbr75Zi644IIuz0Y6Sk9Pb+9Wm5KSQmZmZvtyc3Nzwn3aygCkpqZ2Wc7du+yyG3uM7prC2vT2H8X09HSKioq49957ecc73sG8efN48skn2bp1K7NmzWLr1q2cf/75/OxnP+vyGD3Vp691f+aZZ3j44Yd59NFHqa+vZ//+/Vx11VU88IBa8oezHs893X0ZcBpQ6u5NQA1wedQVExlso0eP5sCBYGTed73rXfzwhz/k4MHg+0tvvfUWlZWVVFRUkJ2dzVVXXcWNN97ImjVrOu2bDOeeey4PPvgge/YEPRv37t3bwx6JnXnmmfzkJz8B4I9//CNVVVU9lr/zzjs588wzWbRoEd/+9rdZsGABZsapp57KM888w5YtWwCora2NO1sBWLhwIX/5y1+oqqqiubmZX/3qVz3Wsbv3+stf/jLl5eVs27aNn//857zzne9UyIwAPQaNmaUD/wr8wsweAq4F9nS/l8jwM378eE4//XTmzJnDY489xgc+8AFOO+005s6dy5IlSzhw4AAbNmxg4cKFLFiwgC996Ut89rOfBeC6667joosu4pxzzklK3U866SRuueUWzjrrLObPn8+nP92/gTluvfVWnnrqKUpKSlixYgUzZszotvyiRYvYsWMHp512GhMnTiQrK6u9OXHChAncd999XHnllcybN49TTz210zWYqVOn8p//+Z+ccsopnHfeecyePZuxY7ufYnvevHmkpaUxf/58vva1r3W6RiMjj/V0umpm3ye4TnN/uOpfgRZ3Xxpx3YZMaWmpl5WVJbsah7WXX36ZWbNmJbsakgQHDx4kNzeX5uZmFi9ezIc//GEWL14c+fPqMxc9M1vt7j321+/NNZp/cvf5MY9Xmtn6/ldNRI4kt912G48//jj19fVccMEFvPvd7052lWSI9SZoWszsGHffChCODNDSwz4ih61TTjmFhob4OUd+/OMfM3fu3AEfe8+ePZx77rmd1j/xxBOMHz9+wMdPxnPeeeedAz6GjGy9CZqbgCfN7DXAgKOAD0VaK5Fh7Lnnnovs2OPHj2fdunWRHX+4PKccWXozBM0TZnYccAJB0GwC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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1030ecc90>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# summarize results\n",
    "print(\"Best: %f using %s\" % (gsearch2_2.best_score_, gsearch2_2.best_params_))\n",
    "test_means = gsearch2_2.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = gsearch2_2.cv_results_[ 'std_test_score' ]\n",
    "train_means = gsearch2_2.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = gsearch2_2.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "pd.DataFrame(gsearch2_2.cv_results_).to_csv('my_preds_maxdepth_min_child_weights_2.csv')\n",
    "\n",
    "# plot results\n",
    "test_scores = np.array(test_means).reshape(len(min_child_weight), len(max_depth))\n",
    "train_scores = np.array(train_means).reshape(len(min_child_weight), len(max_depth))\n",
    "\n",
    "for i, value in enumerate(min_child_weight):\n",
    "    pyplot.plot(max_depth, test_scores[i], label= 'test_min_child_weight:'   + str(value))\n",
    "#for i, value in enumerate(min_child_weight):\n",
    "#    pyplot.plot(max_depth, train_scores[i], label= 'train_min_child_weight:'   + str(value))\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'max_depth' )                                                                                                      \n",
    "pyplot.ylabel( '- Log Loss' )\n",
    "pyplot.savefig( 'max_depth_vs_min_child_weght2.png' )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
